﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Persistence;

namespace Persistence
{

    public class UnitOfWork : IDisposable, IUnitOfWork
    {
        private lanchoneteEntities _context;
        private IRepositorioGenerico<TB_CLIENTE> _repCliente;
        private IRepositorioGenerico<TB_EMPRESA> _repEmpresa;
        private IRepositorioGenerico<TB_SEGMENTO> _repSegmento;
        private IRepositorioGenerico<TB_STATUS> _repStatus;
        private IRepositorioGenerico<TB_INGREDIENTE> _repIngrediente;
        private IRepositorioGenerico<TB_SUBPRODUTO> _repSubproduto;
        private IRepositorioGenerico<TB_PRODUTO> _repProduto;
        private IRepositorioGenerico<TB_CIDADE> _repCidade;
        private IRepositorioGenerico<TB_ESTADO> _repEstado;
        private IRepositorioGenerico<TB_VENDA> _repVenda;
        private IRepositorioGenerico<TB_ITEM> _repItem;


        public UnitOfWork()
        {
            _context = new Model.lanchoneteEntities();
        }


        #region IUnitOfWork Members

        public IRepositorioGenerico<TB_CLIENTE> RepositorioCliente
        {
            get
            {
                if (_repCliente == null)
                {
                    _repCliente = new RepositorioGenerico<TB_CLIENTE>(_context);
                }
                return _repCliente;
            }

        }
        
        public IRepositorioGenerico<TB_EMPRESA> RepositorioEmpresa
        {
            get
            {
                if (_repEmpresa == null)
                {
                    _repEmpresa = new RepositorioGenerico<TB_EMPRESA>(_context);
                }
                return _repEmpresa;
            }

        }

        public IRepositorioGenerico<TB_SEGMENTO> RepositorioSegmento
        {
            get
            {
                if (_repSegmento == null)
                {
                    _repSegmento = new RepositorioGenerico<TB_SEGMENTO>(_context);
                }
                return _repSegmento;
            }

        }

        public IRepositorioGenerico<TB_STATUS> RepositorioStatus
        {
            get
            {
                if (_repStatus == null)
                {
                    _repStatus = new RepositorioGenerico<TB_STATUS>(_context);
                }
                return _repStatus;
            }

        }

        public IRepositorioGenerico<TB_INGREDIENTE> RepositorioIngrediente
        {
            get
            {
                if (_repIngrediente == null)
                {
                    _repIngrediente = new RepositorioGenerico<TB_INGREDIENTE>(_context);
                }
                return _repIngrediente;
            }

        }


        public IRepositorioGenerico<TB_SUBPRODUTO> RepositorioSubproduto
        {
            get
            {
                if (_repSubproduto == null)
                {
                    _repSubproduto = new RepositorioGenerico<TB_SUBPRODUTO>(_context);
                }
                return _repSubproduto;
            }

        }
        public IRepositorioGenerico<TB_PRODUTO> RepositorioProduto
        {
            get
            {
                if (_repProduto == null)
                {
                    _repProduto = new RepositorioGenerico<TB_PRODUTO>(_context);
                }
                return _repProduto;
            }

        }

        public IRepositorioGenerico<TB_CIDADE> RepositorioCidade
        {
            get
            {
                if (_repCidade == null)
                {
                    _repCidade = new RepositorioGenerico<TB_CIDADE>(_context);
                }
                return _repCidade;
            }

        }


        public IRepositorioGenerico<TB_ESTADO> RepositorioEstado
        {
            get
            {
                if (_repEstado == null)
                {
                    _repEstado = new RepositorioGenerico<TB_ESTADO>(_context);
                }
                return _repEstado;
            }

        }
        public IRepositorioGenerico<TB_VENDA> RepositorioVenda
        {
            get
            {
                if (_repVenda == null)
                {
                    _repVenda = new RepositorioGenerico<TB_VENDA>(_context);
                }
                return _repVenda;
            }

        }
        public IRepositorioGenerico<TB_ITEM> RepositorioItem
        {
            get
            {
                if (_repItem == null)
                {
                    _repItem = new RepositorioGenerico<TB_ITEM>(_context);
                }
                return _repItem;
            }

        }

        public void Commit(bool shared) {

            if (!shared)
                _context.SaveChanges();
        }

        #endregion

        private bool disposed = false;

        
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    _context.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }


    }
}

